#include "funcionHash.h"

//#define _CANT_LETRAS_	4

unsigned int FuncionHash::procesar_tipo_string(TipoString &dato){
	std::string cadena = dato.get_valor();
	
	unsigned int retorno, indice;
		
	//sumo el ascii de las primeras _CANT_LETRAS_ por la posicion en las
	//que la leo asi separo mas.
	indice = 0;
	retorno = 0;
	//chequea por el largo de la cadena tambien, para no pasarse
	while( (indice < cadena.size()) /*&& (indice < _CANT_LETRAS_)*/ ){
		retorno += (indice + 1) * cadena[indice];
		indice++;
	}
	retorno/=cadena.size();
	return retorno;
}
		
unsigned int FuncionHash::procesar_tipo_int(TipoInt &dato){
	int valor = dato.get_valor();
	//le paso a positivo si es negativo
	if( valor < 0 )
		valor = -1 * valor;
	return valor;
}
		
FuncionHash::FuncionHash(){}
		
FuncionHash::~FuncionHash(){}
		
unsigned int FuncionHash::operator() (TipoDato &dato){
	
	switch( dato.get_codigo_tipo() ){
		case INT:
			{ //por el ansi C++ XD
				TipoInt * t_int = (TipoInt *)&dato;
				return procesar_tipo_int(*t_int);
			}
			break;
		case STRING:
			{
				TipoString * t_str = (TipoString *)&dato;
				return procesar_tipo_string(*t_str);
			}
			break;
		default:
			return 0; //sabemos que no pasa. Podria lanzarse una excep.		return 0;
	}	
	
}
